//在运行状态中，对于任意一个类，都能够获取到这个类的所有属性和方法，对于任意一个对象，都能够调用它的任意一个方法和属性(包括私有的方法和属性)，
//这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。
//通俗点讲，通过反射，该类对我们来说是完全透明的，想要获取任何东西都可以。

//想要使用反射机制，就必须要先获取到该类的字节码文件对象(.class)，
//通过字节码文件对象，就能够通过该类中的方法获取到我们想要的所有信息(方法，属性，类名，父类名，实现的所有接口等等)，
//每一个类对应着一个字节码文件也就对应着一个Class类型的对象，也就是字节码文件对象。

//https://www.cnblogs.com/whgk/p/6122036.html
//https://zhinan.sogou.com/guide/detail/?id=316513513313

import java.awt.desktop.SystemSleepEvent;
import java.lang.reflect.*;

public class reflectTest {
    public String string1 = "tutorial";
    public String string2 = "tutorial2";
    public static void main(String[] args) throws IllegalAccessException {
        //实例化对象，通过对象来获得Class类
        reflectTest t = new reflectTest();
        Class cls = t.getClass();
        //获得所有public的数据域，即属性
        Field[] fields = cls.getFields();
        //获得所有public的方法
        Method[] methods = cls.getMethods();
        //获得所有public的构造方法,此时只有一个默认无参的
        Constructor[] constructors = cls.getConstructors();

        for(Field f:fields) {
            System.out.println("field->" + f.toString());
            System.out.println("content->" + f.get(new reflectTest()));
            System.out.println("type->" + f.getType());
        }

        for(Method m : methods){
            System.out.println("method->"+m.toString());
        }

        for(Constructor c : constructors){
            System.out.println("constructor->" + c.toString());
        }
    }
}